package com.closer.service.biz.app.service;

import com.closer.service.biz.app.dto.AppAddRequest;
import com.closer.service.biz.app.dto.AppAdminUpdateRequest;
import com.closer.service.biz.app.dto.AppQueryRequest;
import com.closer.service.biz.app.dto.AppUpdateRequest;
import com.closer.service.biz.app.dto.vo.AppVO;
import com.closer.service.biz.user.dto.vo.LoginUserVO;
import com.closer.service.biz.user.entity.User;
import com.closer.service.support.common.DeleteRequest;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.service.IService;
import com.closer.service.biz.app.entity.App;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import reactor.core.publisher.Flux;

import java.util.List;

/**
 * 应用 服务层。
 *
 * @author closer
 */
public interface AppService extends IService<App> {

    /**
     * 添加应用
     * @param params 添加应用参数
     * @param loginUser 登录用户
     * @return 新增应用ID
     */
    long addApp(AppAddRequest params, LoginUserVO loginUser);

    /**
     * 修改应用
     * @param params 修改应用参数
     * @param loginUser 登录用户
     * @return 修改结果
     */
    boolean updateApp(AppUpdateRequest params, LoginUserVO loginUser);

    /**
     * 删除应用
     * @param params 删除参数
     * @param loginUser 登录用户
     * @return 删除结果
     */
    boolean delete(DeleteRequest params, LoginUserVO loginUser);

    /**
     * 获取应用信息
     * @param id 应用ID
     * @return 应用信息
     */
    AppVO getAppVO(Long id);

    /**
     * 获取应用查询条件
     * @param params   查询参数
     * @return 查询条件
     */
    QueryWrapper getQueryWrapper(AppQueryRequest params);

    /**
     * 获取应用列表
     * @param appList 应用列表
     * @return 应用列表
     */
    List<AppVO> getAppVOList(List<App> appList);

    /**
     * 获取我的应用列表
     * @param params 查询参数
     * @param loginUser 登录用户
     * @return 应用列表
     */
    Page<AppVO> getMyAppVOByPage(AppQueryRequest params, LoginUserVO loginUser);

    /**
     * 获取精选应用列表
     * @param params 获取参数
     * @return 应用列表
     */
    Page<AppVO> getGoodAppVOByPage(AppQueryRequest params);

    /**
     * 删除应用
     * @param params 删除参数
     * @return 删除结果
     */
    boolean deleteByAdmin(DeleteRequest params);

    /**
     * 修改应用
     * @param params 修改参数
     * @return 修改结果
     */
    boolean updateByAdmin(AppAdminUpdateRequest params);

    /**
     * 获取应用列表
     * @param params 获取参数
     * @return 应用列表
     */
    Page<AppVO> listAppVOByPageByAdmin(AppQueryRequest params);

    /**
     * 应用聊天生成代码（流式 SSE）
     *
     * @param appId   应用 ID
     * @param message 用户消息
     * @param loginUser 登录用户
     * @return 生成结果流
     */
    Flux<String> chatToGenCode(Long appId, String message, LoginUserVO loginUser);

    /**
     * 应用部署
     *
     * @param appId   应用 ID
     * @param loginUser 登录用户
     * @return 部署结果
     */
    String deployApp(Long appId, LoginUserVO loginUser);

    /**
     * 异步生成应用截图并更新封面
     *
     * @param appId  应用ID
     * @param appUrl 应用访问URL
     */
    void generateAppScreenshotAsync(Long appId, String appUrl);

    /**
     * 下载应用代码
     *
     * @param appId  应用ID
     * @param loginUserVO 登录用户
     * @param response 响应对象
     */
    void downloadAppCode(Long appId, LoginUserVO loginUserVO, HttpServletResponse response);
}
